package entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.validation.Valid;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
public class Venda extends BaseEntity implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	private static final long serialVersionUID = 1L;

	@DecimalMin(value = "0")
	@Digits(integer = 6, fraction = 2)
	@NotNull
	private BigDecimal valor;

	@DecimalMin(value = "0")
	@Digits(integer = 6, fraction = 2)
	@NotNull
	private BigDecimal valorFinal;

	@DecimalMin(value = "0")
	@Digits(integer = 6, fraction = 2)
	@NotNull
	private BigDecimal valorDesconto;

	private Date dataVenda;

	@DecimalMin(value = "0")
	@Digits(integer = 2, fraction = 2)
	@NotNull
	private BigDecimal percDesconto;

	@OneToMany(mappedBy = "venda")
	@NotNull
	@Valid
	private List<ItemVenda> listaItemVenda;

	@OneToMany
	@NotNull
	@Size(max = 4, min = 1)
	private List<FormaPagamentoVenda> listaFormasPagamento;

	@ManyToOne
	private Pessoa pessoa;

	public Venda() {
		super();
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;

	}

	public void addItemVenda(ItemVenda itemVenda) {
		itemVenda.setVenda(this);
		this.listaItemVenda.add(itemVenda);

		this.setValor(this.getValor().add(
				itemVenda.getProduto().getValorVenda()
						.multiply(new BigDecimal(itemVenda.getQuantidade()))));

	}

	public void addFormaPagamentoVenda(FormaPagamentoVenda formaPagamentoVenda) {
		this.getListaFormasPagamento().add(formaPagamentoVenda);
	}

	public void removerFormaPagamentoVenda(
			FormaPagamentoVenda formaPagamentoVenda) {
		this.getListaFormasPagamento().remove(formaPagamentoVenda);
	}

	public void removerItemVenda(ItemVenda itemVenda) {
		this.listaItemVenda.remove(itemVenda);

		this.setValor(this.getValor().subtract(
				itemVenda.getProduto().getValorVenda()
						.multiply(new BigDecimal(itemVenda.getQuantidade()))));

	}

	public List<FormaPagamentoVenda> getListaFormasPagamento() {
		return listaFormasPagamento;
	}

	public void setListaFormasPagamento(
			List<FormaPagamentoVenda> listaFormasPagamento) {
		this.listaFormasPagamento = listaFormasPagamento;
	}

	public BigDecimal getValor() {
		return valor;
	}

	public double getValorDouble() {
		return valor != null ? valor.doubleValue() : 0D;
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	public BigDecimal getValorFinal() {
		return valorFinal;
	}

	public void setValorFinal(BigDecimal valorFinal) {
		this.valorFinal = valorFinal;
	}

	public BigDecimal getValorDesconto() {
		return valorDesconto;
	}

	public void setValorDesconto(BigDecimal valorDesconto) {
		this.valorDesconto = valorDesconto;
	}

	public Date getDataVenda() {
		return dataVenda;
	}

	public void setDataVenda(Date dataVenda) {
		this.dataVenda = dataVenda;
	}

	public BigDecimal getPercDesconto() {
		return percDesconto;
	}

	public void setPercDesconto(BigDecimal percDesconto) {
		this.percDesconto = percDesconto;
	}

	public List<ItemVenda> getListaItemVenda() {
		return listaItemVenda;
	}

	public void setListaItemVenda(List<ItemVenda> listaItemVenda) {
		this.listaItemVenda = listaItemVenda;
	}

	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

}
